package com.heima.search.service.impl;

import com.heima.common.dto.PageResponseResult;
import com.heima.common.dto.ResponseResult;
import com.heima.common.dto.User;
import com.heima.common.util.AppThreadLocalUtil;
import com.heima.search.dto.ApArticleSearchDto;
import com.heima.search.entity.ApArticleSearch;
import com.heima.search.repository.ApArticleSearchRepository;
import com.heima.search.service.IApUserSearchService;
import com.heima.search.service.IArticleSearchService;
import net.bytebuddy.asm.Advice;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.ArrayList;

/**
 * 用户搜索微服务, 业务逻辑实现
 */
@Service
public class ArticleSearchServiceImpl implements IArticleSearchService {


    @Autowired
    ElasticsearchRestTemplate elasticsearchRestTemplate; // es的搜索引擎远程调用
    @Autowired
    ApArticleSearchRepository searchRepository; // es 的仓库接口    两个选一个就可以

    @Autowired
    IApUserSearchService userSearchService; // 用户搜索记录服务


    /**
     * 用户搜索功能, 列表查询
     * @param dto
     * @return
     */
    @Override
    public ResponseResult search(ApArticleSearchDto dto) {
        //1. 判断输入的关键字是否为空, 为空的话返回空的数据列表, 空集合          trim:去掉前后空格
        if (dto == null || StringUtils.isEmpty(dto.getSearchWords()) || StringUtils.isEmpty(dto.getSearchWords().trim())){
            return new PageResponseResult(dto.getPage(), dto.getSize(), 0L, new ArrayList<ApArticleSearch>());
        }
        //2. 分页查询, 构建分页条件, 用户输入的关键字条件,标题查询
        QueryBuilder query = QueryBuilders.matchQuery("title", dto.getSearchWords());
        //3. 分页条件, 前端传来的是1, search是从0开始, 所以－1 , 然后按照发布时间降序排序
        Pageable page = PageRequest.of(dto.getPage().intValue() - 1, dto.getSize(), Sort.Direction.DESC, "publishTime");
        //4.进行分页查询
        Page<ApArticleSearch> sPage = searchRepository.search(query, page);
        //5. 构建前端返回的分页结果集
        PageResponseResult result = new PageResponseResult(dto.getPage(),dto.getSize(),
                // getTotalElements总条数,  getContent返回的是查询到的数据
                sPage.getTotalElements(), sPage.getContent());

        //6. 异步保存用户的搜索记录  1 启动类上添加注解   2 新建任务类 添加异步方法
        //6.1 获取当前的用户
        User user = AppThreadLocalUtil.get();
        // 定义初始用户di为空
        Integer userId = null;
        // 如果过用户信息 不为空
        if (user != null){
            // 写入用户id
            userId = user.getUserId();
        }
        //否则是游客登录, 调用 用户搜索记录服务,
        userSearchService.saveSearchRecord(dto.getSearchWords(), userId, dto.getEquipmentId());
        // 最后返回结果
        return result;
    }
}
